/**
 * 数值补零
 * @param {*} n
 * @returns 
 */
function padZero(n) {
    if (typeof n === 'string') n = parseInt(n)
    return n > 9 ? n : '0' + n
}

/**
 * 时间字符串格式化
 * @param {*} dateInfo 
 * @param {*} formatter 格式化字符串
 * @returns 
 */
function formatterString(dateInfo, formatter) {
    const { yyyy, M, d, H, m, s } = dateInfo
    let MM = padZero(M); // 月份补零
    let dd = padZero(d); // 日期补零
    let HH = padZero(H); // 小时补零
    let mm = padZero(m); // 分钟补零
    let ss = padZero(s); // 秒数补零
    let hh, h; // 12小时制, 补零

    // 24 小时制 转 12 小时制
    if (H > 12) {
        h = H - 12
        hh = padZero(H - 12)
    } else {
        h = H
        hh = padZero(H)
    }

    return formatter.replaceAll('yyyy', yyyy)
        .replaceAll('MM', MM)
        .replaceAll('M', M)
        .replaceAll('dd', dd)
        .replaceAll('d', d)
        .replaceAll('HH', HH)
        .replaceAll('H', H)
        .replaceAll('hh', hh)
        .replaceAll('h', h)
        .replaceAll('mm', mm)
        .replaceAll('m', m)
        .replaceAll('ss', ss)
        .replaceAll('s', s)

}

/**
 * 日期格式化参数归一化
 * @param {*} formatter 
 * @param {*} dateInfo
 * @returns 
 */ 
function formatterNormalization(formatter, dateInfo) {
    // 判断是否为函数
    if (typeof formatter === 'function') return formatter(dateInfo)
    // 判断是否为字符串
    if (typeof formatter !== 'string') throw new Error('formatter must be a function or string')
    // 默认格式化字符串
    if (formatter === 'datetime') {
        formatter = 'yyyy-MM-dd hh:mm:ss'
    } else if (formatter === 'date') {
        formatter = 'yyyy-MM-dd'
    }
    // 格式化字符串
    return formatterString(dateInfo, formatter)
}


/**
 * 格式化日期
 * @param {Date} date
 * @param {*} formatter 格式化字符串，默认yyyy-MM-dd hh:mm:ss | date | datetime  
 * @returns {string}
 */
function dateFormat(date, formatter = 'yyyy-MM-dd hh:mm:ss') {
    // 获取当前时间
    const yyyy = date.getFullYear() // 年份
    const M = date.getMonth() + 1 // 月份
    const d = date.getDate() // 日期
    const H = date.getHours() // 小时
    const m = date.getMinutes() // 分钟
    const s = date.getSeconds() // 秒

    return formatterNormalization(formatter, { yyyy, M, d, H, m, s })
}

module.exports = dateFormat